home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prtrans4.c < prev    next >
C/C++ Source or Header  |  1995-04-06  |  3KB  |  167 lines

  1. #ifdef __linux__
  2. #include <unistd.h>
  3. #include <asm/io.h>
  4. #endif __linux__
  5. #include "prtrans.h"
  6.  
  7. unsigned baseaddr, stataddr;
  8.  
  9. int prinit (void) {
  10. #ifdef __linux__
  11.   if (ioperm (baseaddr, 2, 1))
  12.     return -1;
  13. #endif /* __linux__ */
  14.  
  15.   outb(128, baseaddr); /* set the -FLAG signal to high */
  16.   stataddr = baseaddr + 1;
  17.  
  18.   return 0;
  19. }
  20.  
  21. void prclose (void) {
  22. }
  23.  
  24. void output (unsigned char byte) {
  25.   send (&byte, 1);
  26. }
  27.  
  28. unsigned input (void) {
  29.   unsigned char byte;
  30.  
  31.   receive (&byte, 1);
  32.   return byte;
  33. }
  34.  
  35. unsigned wait_input (void) {
  36.   register unsigned char data;
  37.  
  38.   outb(0, baseaddr);
  39.   while (!(128 & inb(stataddr)))
  40.     usleep (SLEEP_TIME); /* wait between each try */
  41.  
  42.   outb(128, baseaddr);
  43.   data = (inb(stataddr) & 0x78) >> 3;
  44.   outb(0, baseaddr);
  45.   while (128 & inb(stataddr));
  46.   data |= (inb(stataddr) & 0x78) << 1;
  47.   outb(128, baseaddr);
  48.  
  49.   return data;
  50. }
  51.  
  52. #if !defined(__i386__) && !defined(__GNU_C__)
  53. void send (unsigned char *buffer, unsigned length) {
  54.   register unsigned char byte;
  55.  
  56.   while (length--) {
  57.     byte = *buffer++;
  58.  
  59.     outb(byte & 0x0f, baseaddr);
  60.     while (!(128 & inb(stataddr)));
  61.     outb(128, baseaddr);
  62.     outb(byte >> 4, baseaddr);
  63.     while (128 & inb(stataddr));
  64.     outb(128, baseaddr);
  65.   }
  66. }
  67. #else /* __i386__ && __GNU_C__ */
  68. void send (unsigned char *buffer, unsigned length) {
  69.   asm ("push %%ebp
  70.     movw _baseaddr,%%dx
  71.     movl %1,%%ecx
  72.     movl %0,%%ebp
  73.  
  74. sloop:    movb (%%ebp),%%al
  75.     andb $0x0f,%%al
  76.     outb %%al,%%dx
  77.     incw %%dx
  78.  
  79. ewait:    inb %%dx,%%al
  80.     testb $0x80,%%al
  81.     jz ewait
  82.  
  83.     decw %%dx
  84.     movb $0x80,%%al
  85.     outb %%al,%%dx
  86.     movb (%%ebp),%%al
  87.     shrb $4,%%al
  88.     outb %%al,%%dx
  89.         incw %%dx
  90.  
  91. zwait:    inb %%dx,%%al
  92.     testb $0x80,%%al
  93.     jnz zwait
  94.  
  95.     decw %%dx
  96.     movb $0x80,%%al
  97.     outb %%al,%%dx
  98.  
  99.     inc %%ebp
  100.     loop sloop
  101.     pop %%ebp"
  102.        : /* no outputs */
  103.        : "g" (buffer), "g" (length)
  104.        : "ax", "ecx", "dx");
  105. }
  106. #endif /* __i386__ && __GNU_C__ */
  107.  
  108. #if !defined(__i386__) && !defined(__GNU_C__)
  109. void receive (unsigned char *buffer, unsigned length) {
  110.   register unsigned char data;
  111.  
  112.   while (length--) {
  113.     outb(0, baseaddr);
  114.     while (!(128 & inb(stataddr)));
  115.     outb(128, baseaddr); 
  116.     data = (inb(stataddr) & 0x78) >> 3;
  117.     outb(0, baseaddr);
  118.     while (128 & inb(stataddr));
  119.     *buffer++ = data | ((inb(stataddr) & 0x78) << 1);  
  120.     outb(128, baseaddr);
  121.   }
  122. }
  123. #else /* __i386__ && __GNU_C__ */
  124. void receive (unsigned char *buffer, unsigned length) {
  125.   asm ("push %%ebp
  126.     movw _baseaddr,%%dx
  127.     movl %1,%%ecx
  128.     movl %0,%%ebp
  129.  
  130. rloop:    xorb %%al,%%al
  131.     outb %%al,%%dx
  132.     incw %%dx
  133.  
  134. dwait:    inb %%dx,%%al
  135.     testb $0x80,%%al     
  136.     jz dwait
  137.  
  138.     andb $0x78,%%al
  139.     shrb $3,%%al
  140.     movb %%al,(%%ebp)
  141.     decw %%dx
  142.     movb $0x80,%%al
  143.     outb %%al,%%dx
  144.     xorb %%al,%%al
  145.     outb %%al,%%dx
  146.     incw %%dx
  147.  
  148. vwait:    inb %%dx,%%al
  149.     testb $0x80,%%al
  150.     jnz vwait
  151.  
  152.     andb $0x78,%%al
  153.     shlb $1,%%al
  154.     orb %%al,(%%ebp)
  155.     decw %%dx
  156.     movb $0x80,%%al
  157.     outb %%al,%%dx
  158.  
  159.     inc %%ebp
  160.     loop rloop
  161.     pop %%ebp"
  162.        : /* no outputs */
  163.        : "g" (buffer), "g" (length)
  164.        : "ax", "ecx", "dx");
  165. }
  166. #endif /* __i386__ && __GNU_C__ */
  167.